package com.wang.springbootinit.manager;

import com.wang.springbootinit.common.ErrorCode;
import com.wang.springbootinit.config.RedissonConfig;
import com.wang.springbootinit.exception.BusinessException;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 专门提供RedisLimiter 限流基础服务的 提供了通用的能力
 */
@Service
public class RedisLimiterManager {

    @Resource
    private RedissonConfig redissonConfig;

    /**
     * 限流操作
     *
     * @param key 针对每个用户都去进行限流
     */
    public void doRateLimit(String key) {
        RedissonClient redissonClient = redissonConfig.redissonClient();
        // 创建 RateLimiter 对象，设置每秒钟允许的操作次数
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        rateLimiter.trySetRate(RateType.PER_CLIENT, 1, 1, RateIntervalUnit.SECONDS); // 每秒钟1次
        boolean acquire = rateLimiter.tryAcquire();
        if (!acquire) {
            throw new BusinessException(ErrorCode.TOO_MANY_REQUEST);
        }
    }

}
